package com.example.controller;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.example.constants.MyConstants;
import com.example.dto.DispatchShiftDTO;
import com.example.pojo.Instruction;
import com.example.resultType.Result;
import com.example.service.InstructionServiceImpl;
import com.example.utils.PicUtil;
import com.example.utils.VideoUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

//指令新增controller
@RestController
@RequestMapping("/ins")
public class InstructionController {

    @Autowired
    private InstructionServiceImpl instructionService;

    private PicUtil picUtil = new PicUtil();
    private VideoUtil videoUtil = new VideoUtil();

    /**
     *
     * @param instype 合并指令类型
     * @param zone 任务区
     * @param image 图片 示例： C:\Users\Administrator\Desktop\picture.jpg
     * @param video 视频 示例： C:\Users\Administrator\Desktop\testVideo.mp4
     * @param insperson 调查人员
     * @param status 审核状态
	 * @param featureId1 合并要素1 id
	 * @param featureId2 合并要素2 id
	 * @param notes 备注
	 * @param dto 属性  List<Map<String, Object>> 每一个Map都对应一组属性

     * @return java.lang.String
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 10:52
     */

    @RequestMapping("/merge")
    public String merge(String instype, String zone,
                        String image, String video,
                        String insperson, String status,
                        String featureId1, String featureId2,
                        String notes,
                        @RequestBody DispatchShiftDTO dto){
        JSONObject jsonObject = new JSONObject();
        JSONArray jsonArray1 = new JSONArray();
        jsonArray1.add(featureId1);
        jsonArray1.add(featureId2);
        jsonObject.put("arts合并要素",jsonArray1);

        JSONArray jsonArray2 = new JSONArray();
        for(int i = 0; i < dto.getList().size(); i++){
            for (Map.Entry<String, Object> entry : dto.getList().get(i).entrySet()) {
                jsonArray2.add(entry.getKey());
                jsonArray2.add(entry.getValue());
            }
        }
        jsonObject.put("property合并属性",jsonArray2);
        String change = jsonObject.toJSONString();

        //处理 图片和视频的地址、名称
        String[] strImg = image.replace("\\", ",").split(",");
        String[] strVdeo = video.replace("\\", ",").split(",");

        // System.out.println(strImg[strImg.length - 1]);
        // System.out.println(strVdeo[strVdeo.length - 1]);

        String picUrl = MyConstants.picPath + strImg[strImg.length - 1];
        String vdoUrl = MyConstants.vdoPath + strVdeo[strVdeo.length - 1];

        //将图片和视频保存在本地
        savePic(image, strImg[strImg.length - 1]);
        saveVdo(video, strVdeo[strVdeo.length - 1]);

        //指令入库
        Result<Instruction> result = saveToDB(instype, zone, change, picUrl, vdoUrl, insperson, status, notes);
        return result.toString();
    }


    /**
     *
     * @param instype 合并更新指令类型
     * @param zone 任务区
     * @param image 图片 示例： C:\Users\Administrator\Desktop\picture.jpg
     * @param video 视频 示例： C:\Users\Administrator\Desktop\testVideo.mp4
     * @param insperson 调查人员
     * @param status 审核状态
     * @param mergeFeatureId 合并要素id
     * @param updateFeatureId 更新要素id
     * @param notes 备注
     * @param dto 属性  List<Map<String, Object>> 每一个Map都对应一组属性

     * @return java.lang.String
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 10:55
     */

    @RequestMapping("/mergeUpdate")
    public String mergeUpdate( String instype,  String zone,
                         String image,  String video,
                         String insperson,  String status,
                         String mergeFeatureId,  String updateFeatureId,
                         String notes,  @RequestBody DispatchShiftDTO dto){
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("合并要素", mergeFeatureId);
        jsonObject.put("更新要素", updateFeatureId);

        JSONArray jsonArray = new JSONArray();
        for(int i = 0; i < dto.getList().size(); i++){
            for (Map.Entry<String, Object> entry : dto.getList().get(i).entrySet()) {
                jsonArray.add(entry.getKey());
                jsonArray.add(entry.getValue());
            }
        }
        jsonObject.put("更新变化属性",jsonArray);
        String change = jsonObject.toJSONString();

        //处理 图片和视频的地址、名称
        String[] strImg = image.replace("\\", ",").split(",");
        String[] strVdeo = video.replace("\\", ",").split(",");
        // System.out.println(strImg[strImg.length - 1]);
        // System.out.println(strVdeo[strVdeo.length - 1]);
        String picUrl = MyConstants.picPath + strImg[strImg.length - 1];
        String vdoUrl = MyConstants.vdoPath + strVdeo[strVdeo.length - 1];
        
        //将图片和视频保存在本地
        savePic(image, strImg[strImg.length - 1]);
        saveVdo(video, strVdeo[strVdeo.length - 1]);
    
        //指令入库
        Result<Instruction> result = saveToDB(instype, zone, change, picUrl, vdoUrl, insperson, status, notes);

        return result.toString();
    }

    
    /**
     * 
     * @param instype 拆分指令
     * @param zone 任务区
     * @param image 图片 示例： C:\Users\Administrator\Desktop\picture.jpg
     * @param video 视频 示例： C:\Users\Administrator\Desktop\testVideo.mp4
     * @param insperson 调查人员
     * @param status 审核状态
     * @param splitFeatureId 拆分要素id
     * @param notes 备注
     
     * @return java.lang.String
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 11:01
     */
    
    @RequestMapping("/split")
    public String split(String instype,  String zone,
                               String image,  String video,
                               String insperson,  String status,
                               String splitFeatureId,  String notes){

        //处理 图片和视频的地址、名称
        String[] strImg = image.replace("\\", ",").split(",");
        String[] strVdeo = video.replace("\\", ",").split(",");
        String picUrl = MyConstants.picPath + strImg[strImg.length - 1];
        String vdoUrl = MyConstants.vdoPath + strVdeo[strVdeo.length - 1];
        //将图片和视频保存在本地
        savePic(image, strImg[strImg.length - 1]);
        saveVdo(video, strVdeo[strVdeo.length - 1]);
        //指令入库
        Result<Instruction> result = saveToDB(instype, zone, splitFeatureId, picUrl, vdoUrl, insperson, status, notes);

        return result.toString();
    }
    /**
     *
     * @param instype 属性更新指令
     * @param zone 任务区
     * @param image 图片 示例： C:\Users\Administrator\Desktop\picture.jpg
     * @param video 视频 示例： C:\Users\Administrator\Desktop\testVideo.mp4
     * @param insperson 调查人员
     * @param status 审核状态
     * @param featureId 更新要素id
     * @param notes 备注
     * @param dto 属性  List<Map<String, Object>> 每一个Map都对应一组属性

     * @return java.lang.String
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 11:09
     */
    @RequestMapping("/attrUpdate")
    public String attrUpdate(String instype,  String zone,
                                String image,  String video,
                                String insperson,  String status,
                                String featureId,  String notes,
                                @RequestBody DispatchShiftDTO dto){

        JSONObject jsonObject = new JSONObject();
        jsonObject.put("arts更新要素", featureId);

        JSONArray jsonArray = new JSONArray();
        for(int i = 0; i < dto.getList().size(); i++){
            for (Map.Entry<String, Object> entry : dto.getList().get(i).entrySet()) {
                jsonArray.add(entry.getKey());
                jsonArray.add(entry.getValue());
            }
        }
        jsonObject.put("更新变化属性",jsonArray);
        String change = jsonObject.toJSONString();

        //处理 图片和视频的地址、名称
        String[] strImg = image.replace("\\", ",").split(",");
        String[] strVdeo = video.replace("\\", ",").split(",");
        String picUrl = MyConstants.picPath + strImg[strImg.length - 1];
        String vdoUrl = MyConstants.vdoPath + strVdeo[strVdeo.length - 1];
        //处理 图片和视频的地址、名称
        savePic(image, strImg[strImg.length - 1]);
        saveVdo(video, strVdeo[strVdeo.length - 1]);
        //指令入库
        Result<Instruction> result = saveToDB(instype, zone, change, picUrl, vdoUrl, insperson, status, notes);

        return result.toString();

    }


    /**
     * 指令内容入库
     * @param instype 属性更新指令
     * @param zone 任务区
     * @param change 属性变化内容
     * @param image 图片 示例： C:\Users\Administrator\Desktop\picture.jpg
     * @param video 视频 示例： C:\Users\Administrator\Desktop\testVideo.mp4
     * @param insperson 调查人员
     * @param status 审核状态
     * @param notes 备注
     *
     * @return com.example.resultType.Result
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 11:01
     */
    public Result saveToDB(String instype, String zone, String change, String image, String video, String insperson, String status, String notes){
        //指令操作入库
        Instruction instruction = new Instruction(instype, zone, change, image, video, insperson, status, notes);
        int i = instructionService.newInstruction(instruction);

        Result<Instruction> result = new Result<>();

        if(i > 0){
            result.setCode(MyConstants.SUCCESS);
            result.setData(instruction);
            result.setMessage("已提交审核");
        }else {
            result.setCode(MyConstants.FAILED);
            result.setMessage("提交失败");
        }
        return result;
    }

    /**
     * 将图片保存在本地
     * @param picUrl 入库的图片地址 示例 ： C:\Users\Administrator\Desktop\picture.jpg
     * @param picName 保存在本地的图片名， 默认位picUrl的结尾，示例：picture.jpg

     * @return void
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 11:11
     */
    public void savePic(String picUrl, String picName){
        byte[] btImg = picUtil.getImageFromNetByUrl(picUrl);
        if (null != btImg && btImg.length > 0) {
            System.out.println("读取到：" + btImg.length + "字节");
        } else {
            System.out.println("保存失败！");
        }
    }

    /**
     * 将视频保存在本地
     * @param vdoUrl 入库的视频地址 示例 ： C:\Users\Administrator\Desktop\testVideo.mp4
     * @param vdoName 保存在本地的视频名， 默认位vdoUrl的结尾，示例：testVideo.mp4

     * @return void
     * @author zs
     * @creed: Talk is cheap,show me the code
     * @date 2021/8/25 11:12
     */
    public void saveVdo(String vdoUrl, String vdoName){
        byte[] btImg = videoUtil.getVideoFromNetByUrl(vdoUrl);
        if (null != btImg && btImg.length > 0) {
            System.out.println("读取到：" + btImg.length + "字节");
            videoUtil.writeVideoToDisk(btImg, vdoName);
        } else {
            System.out.println("保存失败！");
        }
    }


    @RequestMapping("/query")
    public String queryAll(){
        List<Instruction> instructions = instructionService.queryAll();

        Result<List<Instruction>> result = new Result<>();

        if(instructions.size() > 0){
            result.setCode(MyConstants.SUCCESS);
            result.setData(instructions);
            result.setMessage("查询成功");
        }else {
            result.setCode(MyConstants.FAILED);
            result.setMessage("查询失败");
        }
        return result.toString();
    }


}
